```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>MySQL索引失效解决方案 | 技术小馆</title>
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            color: #333;
            line-height: 1.8;
        }
        h1, h2, h3, h4 {
            font-family: 'Noto Serif SC', serif;
        }
        .hero-gradient {
            background: linear-gradient(135deg, #6e8efb 0%, #a777e3 100%);
        }
        .code-block {
            background: #2d2d2d;
            color: #f8f8f2;
            border-radius: 0.5rem;
            position: relative;
        }
        .code-block:before {
            content: '';
            position: absolute;
            top: 0;
            right: 0;
            width: 100%;
            height: 40px;
            background: rgba(255,255,255,0.1);
            border-top-left-radius: 0.5rem;
            border-top-right-radius: 0.5rem;
        }
        .code-lang {
            position: absolute;
            top: 10px;
            right: 15px;
            color: #a1a1a1;
            font-size: 0.8rem;
        }
        .card {
            transition: all 0.3s ease;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
        }
        .card:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
        }
        .section-divider {
            position: relative;
            height: 1px;
            background: linear-gradient(90deg, transparent, rgba(0,0,0,0.1), transparent);
            margin: 3rem 0;
        }
        .section-divider:after {
            content: '✦';
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
            background: white;
            padding: 0 1rem;
            color: #a777e3;
        }
        .feature-icon {
            width: 48px;
            height: 48px;
            border-radius: 12px;
            display: flex;
            align-items: center;
            justify-content: center;
            margin-bottom: 1rem;
        }
        .floating-image {
            box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);
            border-radius: 0.75rem;
            transition: all 0.3s ease;
        }
        .floating-image:hover {
            transform: scale(1.02);
        }
        .drop-cap:first-letter {
            float: left;
            font-size: 4.5rem;
            line-height: 0.8;
            margin: 0.15em 0.5rem 0 0;
            color: #6e8efb;
            font-weight: 700;
        }
    </style>
</head>
<body class="bg-gray-50">
    <!-- Hero Section -->
    <section class="hero-gradient text-white py-20 lg:py-32 px-4">
        <div class="max-w-5xl mx-auto">
            <div class="flex flex-col lg:flex-row items-center">
                <div class="lg:w-1/2 mb-10 lg:mb-0 lg:pr-10">
                    <h1 class="text-4xl md:text-5xl font-bold mb-6 leading-tight">MySQL索引失效怎么办</h1>
                    <p class="text-xl opacity-90 mb-8">深入理解索引失效的原因与优化策略，提升数据库查询性能</p>
                    <div class="flex space-x-4">
                        <a href="#solutions" class="bg-white text-indigo-600 hover:bg-indigo-50 px-6 py-3 rounded-lg font-medium transition duration-300">解决方案</a>
                        <a href="#causes" class="bg-indigo-700 hover:bg-indigo-800 px-6 py-3 rounded-lg font-medium transition duration-300">失效原因</a>
                    </div>
                </div>
                <div class="lg:w-1/2">
                    <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1712110804752-a471a60a-5c43-4d35-b855-578027802b8f.png" alt="MySQL索引优化" class="w-full rounded-xl shadow-2xl floating-image">
                </div>
            </div>
        </div>
    </section>

    <!-- Introduction Section -->
    <section class="py-16 px-4">
        <div class="max-w-4xl mx-auto">
            <p class="text-lg text-gray-700 mb-8 drop-cap">当你在进行数据库查询时，索引是一个非常重要的因素，它可以显著提高查询性能，加速数据检索的过程。然而，在实际应用中，我们有时会遇到 MySQL 索引失效的问题，即使我们已经为表创建了索引，但查询却无法有效地利用这些索引，导致性能下降甚至全表扫描。</p>
            <p class="text-lg text-gray-700">所以我们要深入理解 MySQL 索引失效的原因、解决方法以及如何优化查询，以帮助我们更好地理解和应对这一常见的数据库性能问题。</p>
        </div>
    </section>

    <!-- Causes Section -->
    <section id="causes" class="py-16 bg-white px-4">
        <div class="max-w-5xl mx-auto">
            <div class="text-center mb-16">
                <h2 class="text-3xl font-bold mb-4 text-gray-800">理解索引失效的原因</h2>
                <p class="text-xl text-gray-600 max-w-3xl mx-auto">首先，需要理解索引失效的原因，可能包括但不限于以下几点：</p>
            </div>

            <div class="grid md:grid-cols-2 gap-8 mb-12">
                <div class="card bg-gray-50 p-8 rounded-xl">
                    <div class="feature-icon bg-indigo-100 text-indigo-600">
                        <i class="fas fa-code text-2xl"></i>
                    </div>
                    <h3 class="text-xl font-semibold mb-3">使用函数或表达式</h3>
                    <p class="text-gray-600">当在查询条件中使用函数或表达式时，会导致索引失效。因为索引是按照列的值进行存储和排序的，而函数或表达式可能会改变列的值，使得无法命中索引。</p>
                    <div class="mt-6">
                        <div class="code-block p-4 rounded-lg mt-4">
                            <span class="code-lang">SQL</span>
                            <pre class="overflow-x-auto"><code class="text-sm">SELECT * FROM users WHERE YEAR(registration_date) = 2022;</code></pre>
                        </div>
                    </div>
                </div>

                <div class="card bg-gray-50 p-8 rounded-xl">
                    <div class="feature-icon bg-purple-100 text-purple-600">
                        <i class="fas fa-arrows-alt-h text-2xl"></i>
                    </div>
                    <h3 class="text-xl font-semibold mb-3">范围查询</h3>
                    <p class="text-gray-600">当查询条件中使用了范围查询，但是没有在索引列上进行完全匹配时，索引会失效。范围查询会导致索引无法按顺序进行检索。</p>
                    <div class="mt-6">
                        <div class="code-block p-4 rounded-lg mt-4">
                            <span class="code-lang">SQL</span>
                            <pre class="overflow-x-auto"><code class="text-sm">SELECT * FROM products WHERE price > 100;</code></pre>
                        </div>
                    </div>
                </div>
            </div>

            <div class="grid md:grid-cols-3 gap-8">
                <div class="card bg-gray-50 p-6 rounded-lg">
                    <div class="feature-icon bg-blue-100 text-blue-600" style="width: 40px; height: 40px;">
                        <i class="fas fa-exchange-alt"></i>
                    </div>
                    <h4 class="font-semibold mb-2">隐式类型转换</h4>
                    <p class="text-gray-600 text-sm">当查询条件中的列和索引列的数据类型不匹配时，MySQL 可能会进行隐式类型转换，导致索引失效。</p>
                </div>

                <div class="card bg-gray-50 p-6 rounded-lg">
                    <div class="feature-icon bg-green-100 text-green-600" style="width: 40px; height: 40px;">
                        <i class="fas fa-sort-amount-down"></i>
                    </div>
                    <h4 class="font-semibold mb-2">列顺序不匹配</h4>
                    <p class="text-gray-600 text-sm">当查询条件中的列顺序与索引列的顺序不匹配时，可能导致索引失效。</p>
                </div>

                <div class="card bg-gray-50 p-6 rounded-lg">
                    <div class="feature-icon bg-red-100 text-red-600" style="width: 40px; height: 40px;">
                        <i class="fas fa-table"></i>
                    </div>
                    <h4 class="font-semibold mb-2">表连接问题</h4>
                    <p class="text-gray-600 text-sm">在多表连接查询时，连接条件不是索引列，或者使用了函数或表达式时，可能会导致索引失效。</p>
                </div>
            </div>
        </div>
    </section>

    <!-- Visualization Section -->
    <section class="py-16 px-4 bg-gray-50">
        <div class="max-w-5xl mx-auto">
            <h2 class="text-3xl font-bold mb-12 text-center text-gray-800">索引失效常见原因分析</h2>
            <div class="bg-white p-6 rounded-xl shadow-sm">
                <div class="mermaid">
                    pie
                        title MySQL索引失效原因分布
                        "函数/表达式使用" : 35
                        "范围查询" : 25
                        "隐式类型转换" : 20
                        "列顺序不匹配" : 10
                        "表连接问题" : 10
                </div>
            </div>
        </div>
    </section>

    <div class="section-divider"></div>

    <!-- Solutions Section -->
    <section id="solutions" class="py-16 px-4">
        <div class="max-w-5xl mx-auto">
            <h2 class="text-3xl font-bold mb-6 text-center text-gray-800">优化查询语句</h2>
            <p class="text-xl text-gray-600 max-w-3xl mx-auto text-center mb-12">优化查询语句是解决索引失效问题的重要方法</p>

            <div class="grid md:grid-cols-2 gap-8 mb-12">
                <div>
                    <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1712110895643-5da6062f-079d-42f6-9e72-b1c0fa0b8fe0.png" alt="SQL优化" class="w-full rounded-lg floating-image">
                </div>
                <div>
                    <div class="mb-8">
                        <h3 class="text-xl font-semibold mb-3 flex items-center">
                            <span class="w-8 h-8 bg-indigo-100 text-indigo-600 rounded-full flex items-center justify-center mr-3">1</span>
                            避免在查询条件中使用函数或表达式
                        </h3>
                        <p class="text-gray-600">函数或表达式会导致索引失效，因为它们会改变列的值，使得无法通过索引进行有效的查找。因此，在设计查询语句时，尽量避免在查询条件中使用函数或表达式。</p>
                    </div>

                    <div class="mb-8">
                        <h3 class="text-xl font-semibold mb-3 flex items-center">
                            <span class="w-8 h-8 bg-indigo-100 text-indigo-600 rounded-full flex items-center justify-center mr-3">2</span>
                            尽量避免范围查询
                        </h3>
                        <p class="text-gray-600">范围查询（如大于、小于等）会导致索引失效，因为 B-tree 索引只能在索引列上进行完全匹配才能有效利用索引。如果必须使用范围查询，可以尝试将索引列放在范围查询的最后。</p>
                    </div>

                    <div>
                        <h3 class="text-xl font-semibold mb-3 flex items-center">
                            <span class="w-8 h-8 bg-indigo-100 text-indigo-600 rounded-full flex items-center justify-center mr-3">3</span>
                            确保查询条件中的列和索引列的数据类型一致
                        </h3>
                        <p class="text-gray-600">当查询条件中的列和索引列的数据类型不匹配时，MySQL 可能会进行隐式类型转换，导致索引失效。因此，在设计数据库表结构时，应尽量保持查询条件中的列和索引列的数据类型一致。</p>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <!-- Execution Plan Section -->
    <section class="py-16 px-4 bg-white">
        <div class="max-w-5xl mx-auto">
            <div class="flex flex-col md:flex-row gap-8">
                <div class="md:w-1/2">
                    <h2 class="text-3xl font-bold mb-6 text-gray-800">分析执行计划</h2>
                    <p class="text-gray-600 mb-6">分析 SQL 查询的执行计划是解决索引失效问题的有效手段。通过执行 <code class="bg-gray-100 px-2 py-1 rounded">EXPLAIN</code> 命令或其他工具查看查询的执行计划，可以了解 MySQL 在执行查询时选择了哪些索引、如何访问表以及是否进行了全表扫描等信息。</p>
                    
                    <div class="mb-6">
                        <h3 class="text-xl font-semibold mb-3">关注 Extra 列的信息</h3>
                        <p class="text-gray-600">在执行计划中，<code class="bg-gray-100 px-2 py-1 rounded">EXPLAIN</code> 命令的输出结果中的 Extra 列提供了关于查询的一些额外信息，例如是否使用了索引、是否进行了全表扫描等。</p>
                    </div>

                    <div class="mb-6">
                        <h3 class="text-xl font-semibold mb-3">考虑覆盖索引</h3>
                        <p class="text-gray-600">覆盖索引是指查询结果可以完全由索引提供，而不需要访问表中的实际数据行。通过分析执行计划，可以判断是否可以使用覆盖索引来避免对表的访问，从而提高查询性能。</p>
                    </div>
                </div>
                <div class="md:w-1/2">
                    <div class="bg-gray-800 rounded-xl overflow-hidden">
                        <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1712110963070-140900d5-5789-49ff-9852-20dffeb87e98.png" alt="执行计划分析" class="w-full">
                        <div class="p-6">
                            <div class="code-block p-4 rounded-lg">
                                <span class="code-lang">SQL</span>
                                <pre class="overflow-x-auto"><code class="text-sm">EXPLAIN SELECT * FROM users WHERE age > 30;</code></pre>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <!-- Index Creation Section -->
    <section class="py-16 px-4 bg-gray-50">
        <div class="max-w-5xl mx-auto">
            <div class="text-center mb-12">
                <h2 class="text-3xl font-bold mb-4 text-gray-800">创建合适的索引</h2>
                <p class="text-xl text-gray-600 max-w-3xl mx-auto">如果索引失效是由于缺乏合适的索引导致的，那么可以考虑创建新的索引来解决问题</p>
            </div>

            <div class="grid md:grid-cols-3 gap-6 mb-8">
                <div class="card bg-white p-6 rounded-lg">
                    <div class="text-indigo-600 mb-4">
                        <i class="fas fa-chart-line text-3xl"></i>
                    </div>
                    <h3 class="font-semibold text-lg mb-2">分析查询条件和频率</h3>
                    <p class="text-gray-600 text-sm">了解哪些列经常被用于查询，以及哪些查询最频繁，可以帮助确定哪些列应该创建索引。</p>
                </div>

                <div class="card bg-white p-6 rounded-lg">
                    <div class="text-purple-600 mb-4">
                        <i class="fas fa-layer-group text-3xl"></i>
                    </div>
                    <h3 class="font-semibold text-lg mb-2">创建复合索引</h3>
                    <p class="text-gray-600 text-sm">复合索引是基于多个列的索引，可以同时优化多个查询条件，提高查询性能。</p>
                </div>

                <div class="card bg-white p-6 rounded-lg">
                    <div class="text-blue-600 mb-4">
                        <i class="fas fa-umbrella text-3xl"></i>
                    </div>
                    <h3 class="font-semibold text-lg mb-2">考虑覆盖索引</h3>
                    <p class="text-gray-600 text-sm">覆盖索引可以覆盖查询的所有列，从而避免对表的实际数据行进行访问。</p>
                </div>
            </div>

            <div class="bg-white rounded-xl overflow-hidden shadow-sm">
                <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1712111054974-347bb2c2-3a89-4536-a1b6-a37bc0beb84c.png" alt="索引创建" class="w-full">
            </div>
        </div>
    </section>

    <!-- Index Hint Section -->
    <section class="py-16 px-4 bg-white">
        <div class="max-w-5xl mx-auto">
            <div class="flex flex-col md:flex-row gap-8">
                <div class="md:w-1/2">
                    <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1712111124546-89563bf2-90ca-497d-b7fe-260cf263b92f.png" alt="索引提示" class="w-full rounded-lg floating-image">
                </div>
                <div class="md:w-1/2">
                    <h2 class="text-3xl font-bold mb-6 text-gray-800">使用索引提示</h2>
                    <p class="text-gray-600 mb-6">在某些情况下，MySQL 的优化器可能选择了错误的执行计划，导致索引失效。这时可以考虑使用索引提示（Index Hint）来指导优化器选择合适的索引。</p>
                    
                    <div class="mb-6">
                        <h3 class="text-xl font-semibold mb-3">强制使用特定索引</h3>
                        <p class="text-gray-600">可以通过使用 <code class="bg-gray-100 px-2 py-1 rounded">USE INDEX</code> 或者 <code class="bg-gray-100 px-2 py-1 rounded">FORCE INDEX</code> 提示来强制 MySQL 使用特定的索引执行查询。</p>
                        <div class="code-block p-4 rounded-lg mt-4">
                            <span class="code-lang">SQL</span>
                            <pre class="overflow-x-auto"><code class="text-sm">SELECT * FROM users USE INDEX (idx_age) WHERE age > 30;</code></pre>
                        </div>
                    </div>

                    <div>
                        <h3 class="text-xl font-semibold mb-3">禁止使用特定索引</h3>
                        <p class="text-gray-600">可以使用 <code class="bg-gray-100 px-2 py-1 rounded">IGNORE INDEX</code> 提示来禁止 MySQL 使用特定的索引执行查询。</p>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <!-- Statistics Section -->
    <section class="py-16 px-4 bg-gray-50">
        <div class="max-w-5xl mx-auto">
            <div class="flex flex-col md:flex-row gap-8">
                <div class="md:w-1/2">
                    <h2 class="text-3xl font-bold mb-6 text-gray-800">统计信息更新</h2>
                    <p class="text-gray-600 mb-6">需要确保索引的统计信息是最新的。MySQL 使用统计信息来进行查询优化和执行计划选择，如果统计信息过时或不准确，可能会导致索引失效。</p>
                    
                    <div class="mb-6">
                        <h3 class="text-xl font-semibold mb-3">收集统计信息</h3>
                        <p class="text-gray-600">可以使用 <code class="bg-gray-100 px-2 py-1 rounded">ANALYZE TABLE</code> 命令手动收集统计信息，也可以使用 MySQL 自动收集统计信息的机制。</p>
                    </div>

                    <div class="mb-6">
                        <h3 class="text-xl font-semibold mb-3">监控统计信息的更新情况</h3>
                        <p class="text-gray-600">特别是在数据量变化较大或者查询模式变化的情况下，需要更加频繁地更新统计信息。</p>
                    </div>

                    <div>
                        <div class="code-block p-4 rounded-lg">
                            <span class="code-lang">SQL</span>
                            <pre class="overflow-x-auto"><code class="text-sm">ANALYZE TABLE users;</code></pre>
                        </div>
                    </div>
                </div>
                <div class="md:w-1/2">
                    <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1712111234573-d3c955dd-1502-42a3-946a-b9ef8a4adb17.png" alt="统计信息" class="w-full rounded-lg floating-image">
                </div>
            </div>
        </div>
    </section>

    <!-- CTA Section -->
    <section class="py-16 px-4 bg-indigo-700 text-white">
        <div class="max-w-4xl mx-auto text-center">
            <h2 class="text-3xl font-bold mb-6">想要深入了解MySQL优化？</h2>
            <p class="text-xl opacity-90 mb-8">查看我们的完整MySQL优化指南，掌握更多性能调优技巧</p>
            <a href="https://www.yuque.com/docs/share/0d1625ec-de7f-40ec-a986-3a548187ecb5?# 《MySQL优化》" class="inline-block bg-white text-indigo-600 hover:bg-indigo-100 px-8 py-4 rounded-lg font-medium text-lg transition duration-300">查看完整指南</a>
        </div>
    </section>

    <!-- Footer -->
    <footer class="bg-gray-900 text-white py-12 px-4">
        <div class="max-w-5xl mx-auto">
            <div class="text-center">
                <h3 class="text-xl font-semibold mb-2">技术小馆</h3>
                <p class="opacity-80">分享技术知识与最佳实践</p>
                <div class="mt-6">
                    <a href="http://www.yuque.com/jtostring" class="text-indigo-400 hover:text-indigo-300 transition duration-300">http://www.yuque.com/jtostring</a>
                </div>
            </div>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            fontFamily: "'Noto Sans SC', sans-serif"
        });
    </script>
</body>
</html>
```